home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir37 / ushell.zip / SHELL / SH.H < prev    next >
C/C++ Source or Header  |  1990-02-19  |  16KB  |  526 lines

  1. /* MS-DOS SHELL - Header File
  2.  *
  3.  * MS-DOS SHELL - Copyright (c) 1990 Data Logic Limited and Charles Forsyth
  4.  *
  5.  * This code is based on (in part) the shell program written by Charles
  6.  * Forsyth and is subject to the following copyright restrictions:
  7.  *
  8.  * 1.  Redistribution and use in source and binary forms are permitted
  9.  *     provided that the above copyright notice is duplicated in the
  10.  *     source form and the copyright notice in file sh6.c is displayed
  11.  *     on entry to the program.
  12.  *
  13.  * 2.  The sources (or parts thereof) or objects generated from the sources
  14.  *     (or parts of sources) cannot be sold under any circumstances.
  15.  *
  16.  *    $Header: sh.h 1.1 90/01/29 17:46:51 MS_user Exp $
  17.  *
  18.  *    $Log:    sh.h $
  19.  * Revision 1.1  90/01/29  17:46:51  MS_user
  20.  * Initial revision
  21.  * 
  22.  * 
  23.  */
  24.  
  25. #define    LINE_MAX    1000    /* Command line length            */
  26. #define HISTORY_MAX    100    /* History array length            */
  27.                 /* Space for full file name        */
  28. #define FFNAME_MAX    (PATH_MAX + NAME_MAX + 4)
  29. #define CMD_LINE_MAX    127    /* Max command line length        */
  30. #define SSAVE_IO_SIZE    4    /* Save IO array malloc increment    */
  31.  
  32. #define    NPUSH        8    /* limit to input nesting        */
  33.  
  34. #define    NOFILE        20    /* Number of open files            */
  35. #define    NUFILE        10    /* Number of user-accessible files    */
  36. #define    FDBASE        10    /* First file usable by Shell        */
  37.  
  38. #define NL        '\n'
  39. #define SP        ' '
  40. #define    NOT        '^'
  41.                 /* Open in create mode            */
  42. #define O_CMASK        (O_WRONLY | O_CREAT | O_TRUNC | O_TEXT)
  43.                 /* Open in create mode for a pipe    */
  44. #define O_PMASK        (O_RDWR | O_CREAT | O_TRUNC | O_TEXT)
  45.                 /* Open in create mode for swap file    */
  46. #define O_SMASK        (O_RDWR | O_CREAT | O_TRUNC | O_BINARY)
  47. #define O_RMASK        (O_RDONLY | O_NOINHERIT | O_TEXT)
  48.  
  49. /*
  50.  * shell components
  51.  */
  52.  
  53. #define    QUOTE        0200
  54. #define    CMASK        0377
  55. #define    QMASK        (CMASK & ~QUOTE)
  56.  
  57. #define    NOBLOCK        ((C_Op *)NULL)
  58. #define    NOWORD        ((char *)NULL)
  59. #define    NOWORDS        ((char **)NULL)
  60. #define    NOPIPE        (-1)
  61.  
  62. /*
  63.  * Description of a command or an operation on commands.
  64.  * Might eventually use a union.
  65.  */
  66.  
  67. typedef struct op {
  68.     int            type;        /* operation type, see below    */
  69.     char        **words;    /* arguments to a command    */
  70.     struct ioword    **ioact;    /* IO actions (eg, < > >>)    */
  71.     struct op        *left;
  72.     struct op        *right;
  73.     char        *str;        /* identifier for case and for    */
  74. } C_Op;
  75.  
  76. #define    TCOM        1    /* command                */
  77. #define    TPAREN        2    /* (c-list)                */
  78. #define    TPIPE        3    /* a | b                */
  79. #define    TLIST        4    /* a [&;] b                */
  80. #define    TOR        5    /* ||                    */
  81. #define    TAND        6    /* &&                    */
  82. #define    TFOR        7    /* FOR                    */
  83. #define    TDO        8    /* DO                    */
  84. #define    TCASE        9    /* CASE                    */
  85. #define    TIF        10    /* IF                    */
  86. #define    TWHILE        11    /* WHILE                */
  87. #define    TUNTIL        12    /* UNTIL                */
  88. #define    TELIF        13    /* ELSE IF                */
  89. #define    TPAT        14    /* pattern in case            */
  90. #define    TBRACE        15    /* {c-list}                */
  91. #define    TASYNC        16    /* c &                    */
  92. #define    TFUNC        17    /* c () {c-list}            */
  93.  
  94. /* Built in Command list */
  95.  
  96. struct    builtin {
  97.     char    *command;
  98.     int        (*fn)(C_Op *);
  99. };
  100.  
  101. /*
  102.  * actions determining the environment of a process
  103.  */
  104.  
  105. #define    FEXEC        0x0001    /* execute without forking        */
  106.  
  107. /* MSDOS Memory Control Block chain structure */
  108.  
  109. #pragma pack (1)
  110. struct MCB_list    {
  111.     char        MCB_type;    /* M or Z            */
  112.     unsigned int    MCB_pid;    /* Process ID            */
  113.     unsigned int    MCB_len;    /* MCB length            */
  114. };
  115. #pragma pack ()
  116.  
  117. #define MCB_CON        'M'        /* More MCB's            */
  118. #define MCB_END        'Z'        /* Last MCB's            */
  119.  
  120. /* Externs for Swapper assembler function */
  121.  
  122. extern char        cmd_line[];    /* Command line            */
  123. extern char        path_line[];    /* Process path            */
  124. extern unsigned int    SW_intr;    /* interrupt pending        */
  125. extern unsigned int    SW_Blocks;    /* Number of blocks to read    */
  126. extern int        SW_fp;        /* File or EMS Handler        */
  127. extern unsigned int    SW_I0_V_BX;    /* Out interrupt Zero address    */
  128. extern unsigned int    SW_I0_V_ES;
  129. extern unsigned int    SW_I23_V_ES;    /* Our Interrupt 23 address    */
  130. extern unsigned int    SW_I23_V_BX;
  131. extern unsigned long    SW_EMstart;    /* Start addr of extend mem    */
  132. extern unsigned int    SW_Mode;    /* Type of swapping to do    */
  133.                     /* 1 - disk            */
  134.                     /* 2 - Extended    memory        */
  135.                     /* 3 - Expanded    memory        */
  136. extern unsigned int    SW_EMSFrame;    /* EMS Frame segment        */
  137.  
  138. extern int        Swap_Mode;    /* Swapping mode        */
  139.  
  140. /* If you change these values, change sh7, swap_device as well */
  141.  
  142. #define SWAP_OFF    0x0000        /* No swapping            */
  143. #define SWAP_DISK    0x0001        /* Disk only            */
  144. #define SWAP_EXTEND    0x0002        /* Extended memory        */
  145. #define SWAP_EXPAND    0x0004        /* Expanded memory        */
  146.  
  147. /*
  148.  * flags to control evaluation of words
  149.  */
  150.  
  151. #define    DOSUB        0x01    /* interpret $, `, and quotes        */
  152. #define    DOBLANK        0x02    /* perform blank interpretation        */
  153. #define    DOGLOB        0x04    /* interpret [?*            */
  154. #define    DOKEY        0x08    /* move words with `=' to 2nd arg. list */
  155. #define    DOTRIM        0x01    /* trim resulting string        */
  156.  
  157. #define    DOALL        (DOSUB | DOBLANK | DOGLOB | DOKEY | DOTRIM)
  158.  
  159. extern char        *Copy_Right1;
  160. extern char        *Copy_Right2;
  161. extern char        **dolv;        /* $<numeric> values        */
  162. extern int        dolc;        /* $<numeric> count        */
  163. extern int        fn_area_number;    /* Next function area number    */
  164. extern int        exstat;
  165. extern char        gflg;
  166. extern int        talking;    /* interactive (talking-type    */
  167. extern int        execflg;
  168. extern int        multiline;    /* \n changed to ;        */
  169. extern int        *failpt;
  170. extern int        *errpt;
  171. extern int        inparse;    /* In parser flag        */
  172. extern int        Current_Event;    /* Current history event    */
  173.  
  174. /*
  175.  * Break/Continue (in for and while), Return and Exit handler
  176.  */
  177.  
  178. typedef struct brkcon {
  179.     jmp_buf        brkpt;
  180.     struct brkcon    *nextlev;
  181. } Break_C;
  182.                 /* Values returned by longjmp        */
  183. #define BC_LOAD        0    /* Load condition            */
  184. #define BC_BREAK    1    /* Break condition            */
  185. #define BC_CONTINUE    2    /* Continue condition            */
  186.  
  187. extern Break_C    *Break_List;    /* Break list for FOR/WHILE        */
  188. extern Break_C    *Return_List;    /* Return list for RETURN        */
  189. extern Break_C    *SShell_List;    /* SubShell list for EXIT        */
  190. extern bool    level0;        /* Level zero (read profile)        */
  191. extern bool    r_flag;        /* Read only shell            */
  192. extern bool    History_Enabled;
  193.  
  194. /*
  195.  * Save Standard Input/Output/Error structure
  196.  */
  197.  
  198. typedef struct save_io {
  199.     int        depth;            /* Execute recursive depth    */
  200.     int        fp[STDERR_FILENO + 1];    /* File handlers        */
  201. } Save_IO;
  202.  
  203. extern Save_IO    *SSave_IO;        /* Save IO array        */
  204. extern int    NSave_IO_E;        /* Number of entries        */
  205. extern int    MSave_IO_E;        /* Max Number of entries    */
  206.  
  207. /*
  208.  * Function tree processing
  209.  */
  210.  
  211. typedef struct fun_op {
  212.     struct fun_op    *next;        /* Link                */
  213.     C_Op        *tree;        /* The tree itself        */
  214. } Fun_Ops;
  215.  
  216. extern Fun_Ops    *fun_list;        /* List header            */
  217.  
  218. /*
  219.  * redirection
  220.  */
  221.  
  222. typedef struct ioword {
  223.     short    io_unit;    /* unit affected            */
  224.     short    io_flag;    /* action (below)            */
  225.     char    *io_name;    /* file name                */
  226. } IO_Actions;
  227.  
  228. #define    IOREAD        1    /* <                    */
  229. #define    IOHERE        2    /* << (here file)            */
  230. #define    IOWRITE        4    /* >                    */
  231. #define    IOCAT        8    /* >>                    */
  232. #define    IOXHERE        16    /* ${}, ` in <<                */
  233. #define    IODUP        32    /* >&digit                */
  234. #define    IOCLOSE        64    /* >&-                    */
  235.  
  236. #define    IODEFAULT    (-1)    /* token for default IO unit        */
  237.  
  238. /*
  239.  * parsing & execution environment
  240.  */
  241.  
  242. typedef struct env {
  243.     char    *cline;            /* Current line buffer        */
  244.     char    *linep;            /* Current pointer in line    */
  245.     char    *eline;            /* End of line pointer        */
  246.     struct io    *iobase;
  247.     struct io    *iop;
  248.     int        *errpt;
  249.     int        iofd;
  250.     struct env    *oenv;            /* Previous environment        */
  251. } Environ;
  252.  
  253. extern Environ        e;
  254.  
  255. /*
  256.  * here documents
  257.  */
  258.  
  259. typedef struct here {
  260.     char        *h_tag;
  261.     int            h_dosub;
  262.     IO_Actions        *h_iop;
  263.     struct here        *h_next;
  264. } Here_D;
  265.  
  266. /*
  267.  * flags:
  268.  *
  269.  * -a: Set all environment variables to exported
  270.  * -e: Quit on error
  271.  * -f: Disable file name expansion
  272.  * -k: Look for name=value everywhere on command line
  273.  * -n: No execution
  274.  * -t: exit after reading and executing one command
  275.  * -u: Abort if environment variable is not set
  276.  * -v: Echo as read
  277.  * -x: Trace
  278.  */
  279.  
  280. #define FL_TEST(x)    (flags & (1L << ((x) - 'a')))
  281. #define FL_SET(x)    flags |= (1L << ((x) - 'a'))
  282. #define FL_CLEAR(x)    flags &= (~(1L << ((x) - 'a')))
  283.  
  284. extern long    flags;
  285. extern char    *null;        /* null value for variable        */
  286. extern long    ourtrap;    /* Signal processing required        */
  287. extern int    trapset;    /* trap pending                */
  288. extern int    yynerrs;    /* yacc                    */
  289. extern int    Execute_stack_depth;    /* execute function recursion    */
  290.                     /* depth            */
  291.  
  292. /*
  293.  * Variable list
  294.  */
  295.  
  296. typedef struct var {
  297.     char        *value;        /* Value            */
  298.     char        *name;        /* Name                */
  299.     struct var        *next;        /* Link                */
  300.     char        status;        /* Type, see below        */
  301. } Var_List;
  302.  
  303. #define    COPYV        1    /* flag to setval, suggesting copy    */
  304. #define    RONLY        0x01    /* variable is read-only        */
  305. #define    EXPORT        0x02    /* variable is to be exported        */
  306. #define    GETCELL        0x04    /* name & value space was got with getcell */
  307. #define PONLY        0x08    /* PATH Value - no unset        */
  308. #define C_MSDOS        0x10    /* Convert to MSDOS format        */
  309.  
  310. extern Var_List    *vlist;        /* dictionary                */
  311. extern Var_List **S_UL;        /* Start address update location    */
  312. extern Var_List    *path;        /* search path for commands        */
  313. extern Var_List    *ps1;        /* Prompt 1                */
  314. extern Var_List    *ps2;        /* Prompt 2                */
  315. extern Var_List    *ifs;        /* Interfield separators        */
  316. extern Var_List    *C_dir;        /* Current directory            */
  317. extern char    *last_prompt;    /* Last prompt output            */
  318. extern char    *home;        /* Home string                */
  319. extern char    *shell;        /* Shell string                */
  320. extern char    *hsymbol;    /* Hash string                */
  321. extern char    *msymbol;    /* Minus string                */
  322. extern char    *spcl2;
  323. extern char    *history_file;
  324.  
  325. /*
  326.  * SubShell Save Structure
  327.  */
  328.  
  329. typedef struct subshell {
  330.     int        depth;            /* Sub_Shell Depth        */
  331.     Var_List    *header;        /* Header start            */
  332. } S_SubShell;
  333.  
  334. extern S_SubShell    *SubShells;    /* Save Vars array        */
  335. extern int        NSubShells;    /* Number of entries        */
  336. extern int        MSubShells;    /* Max Number of entries    */
  337.  
  338. /* io buffer */
  339.  
  340. typedef struct iobuf {
  341.     unsigned int    id;        /* buffer id            */
  342.     char        buf[512];    /* buffer            */
  343.     char        *bufp;        /* pointer into buffer        */
  344.     char        *ebufp;        /* pointer to end of buffer    */
  345. } IO_Buf;
  346.  
  347. /* possible arguments to an IO function */
  348.  
  349. typedef struct ioarg {
  350.     char        *aword;
  351.     char        **awordlist;
  352.     int            afile;        /* file descriptor        */
  353.     unsigned int    afid;        /* buffer id            */
  354.     long        afpos;        /* file position        */
  355.     IO_Buf        *afbuf;        /* buffer for this file        */
  356. } IO_Args;
  357.  
  358. #define AFID_NOBUF    (~0)
  359. #define AFID_ID        0
  360.  
  361. extern IO_Args    ioargstack[NPUSH];    /* IO argument stack        */
  362.  
  363. /* an input generator's state */
  364.  
  365. typedef struct io {
  366.     int            (*iofn)(struct io *);
  367.     IO_Args        *argp;
  368.     int            peekc;
  369.     char        prev;        /* previous character read by readc() */
  370.     char        nlcount;    /* for `'s            */
  371.     char        xchar;        /* for `'s            */
  372.     char        task;        /* reason for pushed IO        */
  373.     char        dflag;        /* Special processing flag    */
  374. } IO_State;
  375.  
  376. #define DSA_NULL    0x00        /* No special processing req    */
  377. #define DSA_STAR    0x01        /* Special processing for "$*"    */
  378. #define DSA_AMP        0x02        /* Special processing for "$@"    */
  379. #define DSA_MODE    0x03        /* Mode flag            */
  380. #define DSA_END        0x04        /* Last word processing        */
  381. #define DSA_START    0x08        /* First word processed?    */
  382. #define DSA_START1    0x10        /* Subsequent word processed    */
  383. #define DSA_END1    0x20        /* End processing for word    */
  384.  
  385. extern IO_State        iostack[NPUSH];    /* IO Stack            */
  386.  
  387. #define    XOTHER        0    /* none of the below            */
  388. #define    XDOLL        1    /* expanding ${}            */
  389. #define    XGRAVE        2    /* expanding `'s            */
  390. #define    XIO        3    /* file IO                */
  391.  
  392. /* in substitution */
  393.  
  394. #define    INSUB()            (e.iop->task == XGRAVE || e.iop->task == XDOLL)
  395.  
  396. /*
  397.  * IO control
  398.  */
  399.  
  400. extern IO_Args        temparg;    /* temporary for PUSHIO */
  401. #define    PUSHIO(what,arg,gen)    ((temparg.what = (arg)), pushio(&temparg,(gen)))
  402. #define    RUN(what,arg,gen)    ((temparg.what = (arg)), run(&temparg,(gen)))
  403.  
  404. typedef struct wdblock {
  405.     short    w_bsize;
  406.     short    w_nword;
  407.     char    *w_words[1];
  408. } Word_B;
  409.  
  410. extern Word_B    *wdlist;
  411. extern Word_B    *iolist;
  412.  
  413. /*
  414.  * storage allocation
  415.  */
  416.  
  417. extern int        areanum;    /* current allocation area */
  418.  
  419. #define    NEW(type)    (type *)getcell (sizeof (type))
  420. #define    DELETE(obj)    freecell ((char *)obj)
  421.  
  422. /* Functions */
  423.  
  424. extern void    main (int, char **);
  425. extern void    setdash (void);
  426. extern void    fail (void);
  427. extern void    leave (void);
  428. extern void    print_warn (char *, ...);
  429. extern void    print_error (char *, ...);
  430. extern bool    newenv (int);
  431. extern void    quitenv (void);
  432. extern char    *putn (int);
  433. extern void    next (int);
  434. extern void    onintr (int);
  435. extern char    *space (int);
  436. extern char    *strsave (char *, int);
  437. extern void    sig (int);
  438. extern void    runtrap (int);
  439. extern Var_List    *lookup (char *, bool);
  440. extern void    setval (Var_List *, char *);
  441. extern void    s_vstatus (Var_List *, int);
  442. extern bool    isassign (char *);
  443. extern bool    assign (char *, int);
  444. extern bool    gmatch (char *, char *, bool);
  445. extern char    *getcell (unsigned int);
  446. extern void    freecell (char *);
  447. extern void    freearea (int);
  448. extern void    setarea (char *, int);
  449. extern int    getarea (char *);
  450. extern C_Op    *yyparse (void);
  451. extern int    execute (C_Op *, int, int, int);
  452. extern int    run (IO_Args *, int (*)(IO_State *));
  453. extern int    Getc (int);
  454. extern void    unget (int);
  455. extern int    eofc (void);
  456. extern int    readc (void);
  457. extern void    pushio (IO_Args *, int (*)(IO_State *));
  458. extern int    nlchar (IO_State *);
  459. extern int    wdchar (IO_State *);
  460. extern int    dol_char (IO_State *);
  461. extern int    strchar (IO_State *);
  462. extern int    qstrchar (IO_State *);
  463. extern int    filechar (IO_State *);
  464. extern int    gravechar (IO_State *);
  465. extern int    qgravechar (IO_State *);
  466. extern int    linechar (IO_State *);
  467. extern void    closeall (void);
  468. extern int    remap (int);
  469. extern int    openpipe (void);
  470. extern void    closepipe (int);
  471. extern void    markhere (char *, IO_Actions *);
  472. extern void    gethere (void);
  473. extern int    herein (char *, int);
  474. extern void    scraphere (void);
  475. extern void    freehere (int);
  476.  
  477. extern char    **eval (char **, int);
  478. extern char    **makenv (void);
  479. extern char    *evalstr (char *, int);
  480. extern int    subgetc (char, int);
  481. extern Word_B    *addword (char *, Word_B *);
  482. extern char    **getwords (Word_B *);
  483. extern void    put_prompt (char *);
  484. extern bool    eqname (char *, char *);
  485. extern bool    any (char, char *);
  486. extern int    (*inbuilt (char *))();
  487. extern char    *path_append (char *, char *, char *);
  488. extern void    unset (char *, bool);
  489. extern int    S_open (bool, char *, int, ...);
  490. extern int    S_close (int, bool);
  491. extern int    S_dup (int);
  492. extern int    S_dup2 (int, int);
  493. extern void    S_Remap (int, int);
  494. extern void    S_Delete (int);
  495. extern void    Getcwd (void);
  496. extern char    *g_tempname (void);
  497. extern void    S_puts (char *);
  498. extern void    S_putc (int);
  499. extern bool    check_rsh (char *);
  500. extern int    O_for_execute (char *);
  501. extern int    SA_spawn (char **);
  502. extern char    *findeq (char *);
  503. extern int    restore_std (int);
  504. extern void    Load_History (void);
  505. extern void    Dump_History (void);
  506. extern void    Display_History (void);
  507. extern void    Clear_History (void);
  508. extern void    v1_puts (char *);
  509. extern void    v1a_puts (char *);
  510. extern void    v1_putc (char);
  511. extern void    v1printf (char *, ...);
  512. extern int    Get_stdin (IO_Args *);
  513. extern int    Process_Escape (char **);
  514. extern void    Add_History (bool);
  515. extern void    Convert_Slashes (char *);
  516. extern void    Print_ExTree (C_Op *);
  517. extern Fun_Ops    *Fun_Search (char *);
  518. extern void    Save_Function (C_Op *, bool);
  519. extern int    getn (char *);
  520. extern int    Create_NG_VL (void);
  521. extern void    Delete_G_VL (void);
  522. extern void    Restore_Dir (void);
  523. extern void    Restore_Environment (int, int);
  524. extern int    sort_compare (char **, char **);
  525. extern int    Check_Script (char *);
  526.